// 从pinia中引入defineStore函数来定义store
import {defineStore} from "pinia";

// 定义一个store并取名为useStore,遵循官方use开头命名
// defineStore第一个参数是应用程序中store的唯一标识，也就是在定义其他store时该标识不能相同
// 此处可以类比为java中的实体类，useStore就是类名，state就是成员属性，getters就是getter方法，actions就是setter方法
// 每个store都必须有一个唯一id
export const useStore = defineStore('useStore', {

    // 定义state
    // 推荐使用 完整类型推断的箭头函数
    state: () => {
        return {
            // 所有这些属性都将自动推断其类型
            count: 0,
            name: "Eduardo",
            isAdmin: true,
            token: "",
            dialogFormVisible: false,
        };
    },

    // 定义getters,里面定义一些对state值的取值操作
    // 指向箭头函数定义的时候所处的对象，而不是其所使用的时候所处的对象，默认指向父级的this
    // 普通函数中的this指向它的调用者，如果没有调用者则默认指向window
    getters: {
        addCount: (state) => state.count++,
        doubleCountOne(state) {
            return state.count * 2;
        },
        doublePlusOne(): number {
            return this.count * 2 + 1;
        },
        getToken: (state) => state.token,

        getDialogFormVisible: (state) => state.dialogFormVisible
    },

    // 定义actions,里面定义一些对state的赋值操作
    actions: {
        setCounter(count: number) {
            this.count = count;
        },
        setDialogFormVisible(visible: boolean) {
            this.dialogFormVisible = visible
        }
    },
});

// 1、只有一个参数的时候，参数可以不加小括号，没有参数或2个及以上参数的，必须加上小括号
// 2、返回语句只有一条的时候可以不写{}和return，会自动加上return的，返回多条语句时必须加上{}和return
// 3、箭头函数在返回对象的时候必须在对象外面加上小括号
// 在vue中定义函数时，我们尽量都指明函数返回值类型以及参数的数据类型
